package com.tjbank.cssys.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Objects;

import com.tjbank.cssys.framework.base.enums.YesOrNoEnum;
import com.tjbank.cssys.framework.base.exception.ServiceException;
import com.tjbank.cssys.framework.base.util.GeneratIDUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.tjbank.cssys.api.PostService;
import com.tjbank.cssys.api.RelationIDService;
import com.tjbank.cssys.dto.PostDTO;
import com.tjbank.cssys.dto.PostDetailsDTO;
import com.tjbank.cssys.dto.UserDTO;
import com.tjbank.cssys.mapperext.UserMapper;
import com.tjbank.cssys.mybatis.IamGroupDao;
import com.tjbank.cssys.mybatis.entity.IamGroup;
import com.tjbank.cssys.mybatis.entity.IamGroupKey;
import com.tjbank.cssys.mybatis.sqlbuilder.IamGroupSqlBuilder;
import com.tjbank.cssys.service.convert.PostConvert;
import com.tjbank.cssys.service.convert.UserConvert;
import com.tjbank.cssys.service.enums.EntityTypeEnum;
import com.tjbank.cssys.service.util.Const;

/**
 * 岗位
 * 
 * Package : com.tansun.magicube.iam.service.impl
 * 
 * @author -- lijiangtao 2020年6月28日 下午5:48:55
 *
 */
@Service
public class PostServiceImpl implements PostService {

    @Autowired
    private IamGroupDao postDao;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RelationIDService relationIDService;

    /**
     * 新增岗位
     * 
     * @param postDTO
     * @return
     * @author -- lijiangtao 2020年6月28日 下午6:38:01
     */
    @Override
    @Transactional
    public Integer addPost(PostDTO postDTO) {
        IamGroup entity = PostConvert.INSTANCE.dtoToEntity(postDTO);
        entity.setId(GeneratIDUtil.getUUId());
        entity.setType(EntityTypeEnum.POST_TYPE.getCode());
        entity.setState(YesOrNoEnum.YES.getCode());
        entity.setCreateTime(new Date());
        entity.setUpdateTime(new Date());
        return postDao.insert(entity);
    }

    /**
     * 分页查询岗位信息
     * 
     * @param postDTO
     * @param pageable
     * @return
     * @author -- lijiangtao 2020年6月28日 下午6:38:07
     */
    @Override
    @SuppressWarnings("all")
    public Page<PostDTO> queryPost(PostDTO postDTO, Pageable pageable) {
        IamGroupSqlBuilder sqlBuilder = this.setSqlBuilder(postDTO, pageable);
        return new PageImpl(PostConvert.INSTANCE.entitiesToDtoList(postDao.selectListBySqlBuilder(sqlBuilder)), pageable, postDao.countBySqlBuilder(sqlBuilder));
    }

    /**
     * setSqlBuilder
     * 
     * @param postDTO
     * @param pageable
     * @author -- lijiangtao 2020年7月22日 下午4:39:21
     */
    private IamGroupSqlBuilder setSqlBuilder(PostDTO postDTO, Pageable pageable) {
        if (StringUtils.isEmpty(postDTO.getLoginCode())) {
            throw new ServiceException("登录账号不能为空");
        }
        if (StringUtils.isBlank(postDTO.getTenantCode())) {
            throw new ServiceException("tenantCode:租户代码不能为空");
        }
        IamGroupSqlBuilder sqlBuilder = new IamGroupSqlBuilder();
        sqlBuilder.setPageSize(pageable.getPageSize());
        sqlBuilder.setIndexNo((int) pageable.getOffset());

        // 如果租户Code!=系统租户 && 登录账号!=admin 则只查询当前租户下岗位
        if (!Objects.deepEquals(postDTO.getTenantCode(), Const.ROOT_TENANT_CODE) || !Objects.deepEquals(postDTO.getLoginCode(), Const.ROOT_USER_CODE)) {
            sqlBuilder.andTenantCodeEqualTo(postDTO.getTenantCode());
        }
        // 岗位编号
        if (StringUtils.isNotBlank(postDTO.getCode())) {
            sqlBuilder.andCodeLikeBoth(postDTO.getCode());
        }
        // 岗位名称
        if (StringUtils.isNotBlank(postDTO.getName())) {
            sqlBuilder.andNameLikeBoth(postDTO.getName());
        }
        sqlBuilder.andTypeEqualTo(EntityTypeEnum.POST_TYPE.getCode()).andIsDeletedEqualTo(YesOrNoEnum.NO.getCode()).orderByUpdateTime(true).setAutoFilterNull(true);
        return sqlBuilder;
    }

    /**
     * 根据租户Code分页查询岗位信息
     * 
     * @param postDTO
     * @param pageable
     * @return
     * @author -- lijiangtao 2020年7月26日 上午12:05:35
     */
    @Override
    @SuppressWarnings("all")
    public Page<PostDTO> queryPostByTenantCode(PostDTO postDTO, Pageable pageable) {
        IamGroupSqlBuilder sqlBuilder = this.setSqlBuilderByTenantCode(postDTO, pageable);
        return new PageImpl(PostConvert.INSTANCE.entitiesToDtoList(postDao.selectListBySqlBuilder(sqlBuilder)), pageable, postDao.countBySqlBuilder(sqlBuilder));
    }

    /**
     * setSqlBuilderByTenantCode
     * 
     * @param postDTO
     * @param pageable
     * @author -- lijiangtao 2020年7月22日 下午4:39:21
     */
    private IamGroupSqlBuilder setSqlBuilderByTenantCode(PostDTO postDTO, Pageable pageable) {
        if (StringUtils.isBlank(postDTO.getTenantCode())) {
            throw new ServiceException("tenantCode:租户代码不能为空");
        }
        IamGroupSqlBuilder sqlBuilder = new IamGroupSqlBuilder();
        sqlBuilder.setPageSize(pageable.getPageSize());
        sqlBuilder.setIndexNo((int) pageable.getOffset());
        sqlBuilder.andTenantCodeEqualTo(postDTO.getTenantCode());
        // 岗位编号
        if (StringUtils.isNotBlank(postDTO.getCode())) {
            sqlBuilder.andCodeLikeBoth(postDTO.getCode());
        }
        // 岗位名称
        if (StringUtils.isNotBlank(postDTO.getName())) {
            sqlBuilder.andNameLikeBoth(postDTO.getName());
        }
        sqlBuilder.andTypeEqualTo(EntityTypeEnum.POST_TYPE.getCode()).andIsDeletedEqualTo(YesOrNoEnum.NO.getCode()).orderByUpdateTime(false).setAutoFilterNull(true);
        return sqlBuilder;
    }

    /**
     * 更新
     * 
     * @param postDTO
     * @return
     * @author -- lijiangtao 2020年6月28日 下午6:38:03
     */
    @Override
    @Transactional
    public Integer updatePost(PostDTO postDTO) {
        this.checkId(postDTO.getId());
        IamGroup entity = PostConvert.INSTANCE.dtoToEntity(postDTO);
        entity.setUpdateTime(new Date());
        IamGroupSqlBuilder sqlBuilder = new IamGroupSqlBuilder();
        sqlBuilder.andIdEqualTo(entity.getId());
        return postDao.updateBySqlBuilderSelective(entity, sqlBuilder);
    }

    /**
     * 删除
     * 
     * @param postId
     * @return
     * @author -- lijiangtao 2020年6月28日 下午6:38:05
     */
    @Override
    @Transactional
    public Integer deletePost(String postId) {
        this.checkId(postId);
        this.checkUserByPostId(postId);
        return postDao.deleteByPrimaryKey(new IamGroupKey(postId));
    }

    /**
     * 根据岗位ID查询
     * 
     * @param postId
     * @return
     * @author -- lijiangtao 2020年7月9日 下午11:04:43
     */
    @Override
    public PostDetailsDTO queryPostById(String postId) {
        this.checkId(postId);
        PostDetailsDTO postDetailsDTO = new PostDetailsDTO();
        postDetailsDTO.setPostDTO(this.getPostById(postId)).setUserDTOList(this.queryUserByPostId(postId));
        return postDetailsDTO;
    }

    /**
     * 岗位信息
     * 
     * @param postId
     * @return
     * @author -- lijiangtao 2020年7月9日 下午11:22:20
     */
    private PostDTO getPostById(String postId) {
        IamGroupSqlBuilder sqlBuilder = new IamGroupSqlBuilder();
        sqlBuilder.andIdEqualTo(postId).andIsDeletedEqualTo(YesOrNoEnum.NO.getCode());
        return PostConvert.INSTANCE.entityToDto(postDao.selectBySqlBuilder(sqlBuilder));
    }

    /**
     * 根据岗位ID查询用户信息集合
     * 
     * @param postId
     * @return
     * @author -- lijiangtao 2020年7月9日 下午11:51:20
     */
    private List<UserDTO> queryUserByPostId(String postId) {
        List<String> userIdList = relationIDService.queryUserIdByPostId(postId);
        if (userIdList.isEmpty()) {
            return null;
        }
        return UserConvert.INSTANCE.entitiesToDtoList(userMapper.queryUserByIdList(userIdList));
    }

    /**
     * 校验岗位ID
     * 
     * @param nodeId
     * @author -- lijiangtao 2020年6月14日 上午12:37:48
     */
    private void checkId(String id) {
        if (StringUtils.isBlank(id)) {
            throw new ServiceException("岗位ID不能为空");
        }
    }

    /**
     * 校验该岗位下是否存在用户
     * 
     * @param postId
     * @author -- lijiangtao 2020年7月26日 上午2:31:53
     */
    private void checkUserByPostId(String postId) {
        List<String> userIdList = relationIDService.queryUserIdByPostId(postId);
        if (!userIdList.isEmpty()) {
            throw new ServiceException("该岗位下存在用户!");
        }
    }
}
